package com.tang.config;

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoDatabase;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * MongeDB简单介绍：
 *    MongoDB基于分布式文件存储的数据库。由C++语言编写，旨在为WEB应用提供可扩展的高性能数据存储解决方案。
 *    MongoDB是一个高性能，开源，无模式的文档型数据库，是当前NoSql数据库中比较热门的一种。
 *    MongoDB是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库当中功能最丰富，最像关系数据库的。
 *    MongeDB支持的数据结构非常松散，是类似json的bjson格式，因此可以存储比较复杂的数据类型。
 *    Mongo最大的特点是他支持的查询语言非常强大，其语法有点类似于面向对象的查询语言，几乎可以实现类似关系数据库单表查询的绝大部分功能，而且还支持对数据建立索引。
 *    MongoDB是由数据库（database）、集合（collection）、文档对象（document）三个层次组成，集合中没有列、行和关系概念，这体现了模式自由的特点。
 *    MongoDB中的一条记录就是一个文档，是一个数据结构，由字段和值对组成，MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。
 *    MongoDB的适合对大量或者无固定格式的数据进行存储，比如：日志、缓存等。对事物支持较弱，不适用复杂的多文档（多表）的级联查询。
 *    linux中执行： ./mongo  --authenticationDatabase admin -u root -p 输入密码进入
 */
@Configuration
@RefreshScope
public class MongoConfig {

    private static final Logger logger = LogManager.getLogger(MongoConfig.class);

    @Value("${mongodb.host}")
    private String host; // 注意：Spring不允许把值注入到静态变量中所以这里使用 @Value 是不起效果的

    @Value("${mongodb.port}")
    private String port;

    @Value("${mongodb.db}")
    private String db;

    @Value("${mongodb.username}")
    private String username;

    @Value("${mongodb.password}")
    private String password;

    @Bean("mdb")
    public MongoDatabase connect() {
        ServerAddress sa = new ServerAddress(host, Integer.parseInt(port));
        List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>();
        mongoCredentialList.add(MongoCredential.createScramSha1Credential(username, db, password.toCharArray()));
//        logger.info("用户名是：" + username + ">>>>>>>>密码是：" + password);
        MongoClient client = new MongoClient(sa, mongoCredentialList);
        MongoDatabase mdb = client.getDatabase(db);
        return mdb;
    }

}
